/**
 * 校验统一社会信用代码
 * @param code 待校验的统一社会信用代码
 * @returns 校验结果，true 表示校验通过，false 表示校验失败
 */

// 加权因子
const weightingFactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];
// 代码字符集
const codeCharacters = "0123456789ABCDEFGHJKLMNPQRTUWXY";
export function validateCreditCode(code: string): boolean {
  // 基本格式校验
  if (code.length !== 18 || !/^[0-9A-Z]+$/.test(code)) {
    return false;
  }

  let sum = 0;
  for (let i = 0; i < 17; i++) {
    const char = code[i];
    const index = codeCharacters.indexOf(char);
    if (index === -1) {
      return false;
    }
    sum += index * weightingFactors[i];
  }

  const remainder = sum % 31;
  const checkCode = 31 - remainder;
  const expectedCheckChar = codeCharacters[checkCode === 31 ? 0 : checkCode];
  const actualCheckChar = code[17];

  return expectedCheckChar === actualCheckChar;
}

/**
 * 校验手机号
 * @param phone 待校验的手机号
 * @returns 校验结果，true 表示校验通过，false 表示校验失败
 */
export function validatePhoneNumber(phone: string): boolean {
  // 国内手机号的正则表达式，以 1 开头，第二位为 3 - 9 中的任意数字，后面跟 9 位数字
  const regex = /^1[3|4|5|6|7|8|9][0-9]\d{8}$/;
  return regex.test(phone);
}

/**
 * 校验手机号或固话
 * @param phone 待校验的号码
 * @returns 校验结果，若校验通过返回 true，否则返回错误信息
 */
export function validatePhoneOrLandline(phone: string): boolean {
  // 固话正则表达式，支持带区号和不带区号，格式如 010-12345678、0755 1234567、1234567 等
  const regex = /^(((\d{3,4}-)?[0-9]{7,8})|(1(3|4|5|6|7|8|9)\d{9}))$/;
  return regex.test(phone);
}

/**
 * 校验身份证号
 * @param idCard 待校验的身份证号
 * @returns 校验结果，若校验通过返回 true，否则返回错误信息
 */
export function validateIDCard(idCard: string): boolean {
  const regex = /^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[1-2]\d|3[0-1])\d{3}(\d|X)$/;
  return regex.test(idCard);
}

/**
 * 校验邮箱
 * @param email 待校验的邮箱地址
 * @returns 校验结果，若校验通过返回 true，否则返回错误信息
 */
export function validateEmail(email: string): boolean {
  const regex = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+/;
  return regex.test(email);
}
